#ifndef ML_VECTOR_H
#define ML_VECTOR_H

typedef float MLVector[3];

extern const float
mlVectorX[3], mlVectorY[3], mlVectorZ[3];

extern const float
mlVectorNegX[3], mlVectorNegY[3], mlVectorNegZ[3];

void
mlVectorPrint(const float *a);

void
mlVectorCopy(const float *a, float *result);

void
mlVectorLoad(float *a, float x, float y, float z);

void
mlVectorLoadX(float *a);

void
mlVectorLoadY(float *a);

void
mlVectorLoadZ(float *a);

void
mlVectorLoadNegX(float *a);

void
mlVectorLoadNegY(float *a);

void
mlVectorLoadNegZ(float *a);

void
mlVectorAddTo(const float *a, const float *b, float *result);

void
mlVectorAdd(float *a, const float *b);

void
mlVectorSubTo(const float *a, const float *b, float *result);

void
mlVectorSub(float *a, const float *b);

void
mlVectorScaleTo(const float *a, float b, float *result);

void
mlVectorScale(float *a, float b);

void
mlVectorNormTo(const float *a, float *result);

float
mlVectorNorm(const float *a);

void
mlVectorDotProductTo(const float *a, const float *b, float *result);

float
mlVectorDotProduct(const float *a, const float *b);

void
mlVectorCrossProductTo(const float *a, const float *b, float *result);

void
mlVectorCrossProduct(float *a, const float *b);

void
mlVectorNormalTo(const float *a, float *result);

void
mlVectorNormal(float *a);

void
mlVectorMultMatrixTo(const float *a, const float *b, float *result);

void
mlVectorMultMatrix(float *a, const float *b);

void
mlVectorRotateTo(const float *a, const float *axis, float angle, float *result);

void
mlVectorRotate(float *a, const float *axis, float angle);

void
mlVectorAngleTo(const float *a, const float *b, float *angle);

float
mlVectorAngle(const float *a, const float *b);

#endif
